import { dataCompletion, isNullOrUndefinedOrEmptyStr } from '@/utils/BaseUtil'
import {
  BackendConditionBuilder,
  type ContextData,
  type FrontCondition
} from './BackendConditionBuilder'
import axios, { type AxiosStatic } from 'axios'

export interface BaseFieldConfig{
  /**
   * # 是否启用
   * ---
   * - 0. 禁用
   * - 1. 启用
   */
  enable:0|1
  resultCompute:'保留2位小数四舍五入'
}
export interface DataFieldConfig extends BaseFieldConfig{
  fieldName:string
  
}

/**
 * # 数据请求构建配置信息
 */
export interface DataReqBuilderOption {
  /**
   * # 请求唯一标识
   */
  flag: string
  /**
   * # 请求url
   */
  url: string
  /**
   * # 请求条件
   */
  frontConditionArr?: FrontCondition[]
  /**
   * 分子字段配置
   */
  fzFieldConfig:DataFieldConfig
  /**
   * 分母字段配置
   */
  fmFieldConfig:DataFieldConfig
  /**
   * 率字段配置
   */
  rateFieldConfig:BaseFieldConfig
  /**
   * # 数据的日期字段与工作日数据中的对应字段
   * ---
   * 当staticsMethod为1或3时，该字段必填
   */
  workDateField?: string
  /**
   * 其他分组标识字段
   */
  otherGroupFlagField?:string
  /**
   * 其他分组名称字段
   */
  otherGroupNameField?:string
}
export interface SimpleWorkdayInfo {
  /**
   * # 年
   */
  year: number | string
  /**
   * # 月
   */
  month: number | string
  /**
   * # 周
   */
  week: number | string
  /**
   * # 日期字符串
   * ----
   * 值格式示例: 20240128, 20241226, 2024-01-09, 2024/01/09
   */
  date: number | string
  /**
   * # 是否工作日
   * ---
   * 0. 否
   * 1. 是
   */
  isWorkDay: 1 | 0
}
/**
 * # 工作日信息
 */
export interface WorkdayInfo {
  /**
   * # 年
   */
  year: number
  /**
   * # 月
   */
  month: number
  /**
   * # 周
   */
  week: number
  /**
   * # 日
   */
  day: number
  /**
   * # 日期
   * ----
   * 值格式示例: 20240128, 20241226
   */
  date: number
  /**
   * # 年周
   * ---
   * 值格式示例: 202401, 202432
   */
  yearWeek: number
  /**
   * # 年月
   * ---
   * 值格式示例: 202401, 202412
   */
  yearMonth: number
  /**
   * # 周几
   * ---
   * 如: 周一，周六，周日
   */
  weekDay: string
  /**
   * 是否未来日期
   * ---
   * 0. 否
   * 1. 是
   */
  isFuture: 1 | 0
  /**
   * # 是否工作日
   * ---
   * 0. 否
   * 1. 是
   */
  isWorkDay: 1 | 0
}

/**
 * # 统计结果项
 */
export interface StatisticsResultItem {
  /**
   * # 数据的日期唯一标识(按日期统计时，该项必须有值)
   * ---
   * - 日期格式：必须是纯数字. 如: 2024, 20240530, 202401
   */
  dateFlag?: string | number | null
  /**
   * # 分类唯一标识（按类型统计时，该项必须有值）
   */
  typeFlag?: string | null
  /**
   * # 分类名
   */
  typeName?: string | null
  /**
   * # 实际值
   */
  FZ?: number | null
  /**
   * # 目标值或计划值
   */
  FM?: number | null
  /**
   * 率(如:合格率，完成率)
   */
  RATE?:number | null
}
export interface ResponseResult<T> {
  code: string | number
  message?: string
  data: T
}
const backendReqBuilder: BackendConditionBuilder = new BackendConditionBuilder()

/**
 * # 获取工作日信息
 * @returns 工作日信息
 */
async function loadWorkdayInfoArr(): Promise<WorkdayInfo[]> {
  return []
}
async function execute(jsonConfig: string, contextData: ContextData = {}, tabValue: string) {
  // 1. 获取工作日信息
  const workdayInfoArr: WorkdayInfo[] = await loadWorkdayInfoArr()

  // 2. 构建统计相关请求
  const promiseArr: Promise<StatisticsResultItem[]>[] = dataReqBuilderOptionArr.map((item) => {
    const { url, frontConditionArr = [] } = item
    const condition = backendReqBuilder.build(frontConditionArr, contextData)
    return axios.post<StatisticsResultItem[]>(url, { condition }) as unknown as Promise<
      StatisticsResultItem[]
    >
  })

  // 3. 获取统计相关请求的请求结果
  const respArr = await Promise.all(promiseArr)
  // 4. 数据补全
  dataCompletion(workdayInfoArr, respArr[curIdx])

  // 5. 将业务数据转换为UI组件需要的数据
}

interface BizReqConfigJson {
  scope: 'lastSevenDay' | 'thisWeek' | 'monthWeek' | 'yearWeek' | 'month' | 'lastFiveYear'
  scopeReq:{
    lastSevenDay:
    thisWeek:
    monthWeek:
    yearWeek:
    month:
    lastFiveYear:
  }
}

interface BizChartConfigJson {}
class BizChartBuilder {
  async builder(jsonConfig: string, contextData: ContextData = {}, tabValue: string) {
    const jsonConfigObj = JSON.parse(jsonConfig)
    const reqArr:BizReqConfig[] = []
    reqArr.push(jsonConfigObj.scopeReq[tabValue].productReq)
    reqArr.push(jsonConfigObj.scopeReq[tabValue].taskReq)

    // 2. 构建统计相关请求
  const promiseArr: Promise<StatisticsResultItem[]>[] = reqArr.map((item) => {
    const { url, frontConditionArr = [] } = item
    const condition = backendReqBuilder.build(frontConditionArr, contextData)
    return axios.post<StatisticsResultItem[]>(url, { condition }) as unknown as Promise<
      StatisticsResultItem[]
    >
  })
  }
}
